import addNsname from '../add-nsname'
import { publishComment } from '../../api/comment'

const name = 'comment' // 模块名
const nsname = name + '/' // 命名空间模块名

const state = {
  // 当前的目标（对于发布评论的时候） - 评论的目标id（评论文章即为文章id，对评论进行回复则为评论id）
  targetOfPublishComment: null,
  // 当前评论回复列表对应的评论对象
  curCommentOfReplyList: null,
  // 当前文章的评论列表
  artileCommentList: [],
  // 评论的回复列表
  commentReplyList: [],
  // 文章评论的总数
  articleCommentTotal: 0,
  // 发布评论内容
  contentOfPublishCommentPopup: '',
  // 是否显示发布评论弹层
  isShowPublishCommentPopup: false,
  // // 是否显示回复列表弹层
  isShowReplyListPopup: false
}

export const getters = {
  toStringOfIsShowPublishCommentPopup (state) {
    return Object.prototype.toString.call(state.isShowPublishCommentPopup)
  }
}
addNsname(nsname, getters)

// export const getters = {
//   toStringOfIsShowPublishCommentPopup (state) {
//     return Object.prototype.toString.call(state.isShowPublishCommentPopup)
//   }
// }
// addNsname(getters, nsname)

// for (const getter of Object.values(getters)) {
//   getter.nsname = nsname + getter.name
// }

export const mutations = {
  // 打开发布评论弹层
  openPublishCommentPopup (state, target) {
    state.targetOfPublishComment = target
    state.isShowPublishCommentPopup = true
  },
  updateTargetOfPublishComment (state, newValue) {
    state.targetOfPublishComment = newValue
  },
  // 关闭回复列表弹层
  closeReplyListPopup (state) {
    state.curCommentOfReplyList = null
    state.isShowReplyListPopup = false
    state.commentReplyList = []
  },
  // 打开回复列表弹层，传个评论对象过来就行了
  openReplyListPopup (state, comment) {
    state.curCommentOfReplyList = comment
    state.isShowReplyListPopup = true
  },
  updateCurCommentOfReplyList (state, newValue) {
    state.curCommentOfReplyList = newValue
  },
  updateIsShowReplyListPopup (state, newValue) {
    state.isShowReplyListPopup = newValue
  },
  // 添加文章评论列表项
  // items: 要添加的评论对象数组
  // type: a, c
  // pos: unshift, push
  // [items, type = 'a', pos = 'push'] ==> 函数的形参数组解构语法
  addListItems (state, [items, type = 'a', pos = 'push']) {
    if (type === 'a') {
      if (pos === 'unshift') {
        state.artileCommentList.unshift(...items)
      } else {
        state.artileCommentList.push(...items)
      }
    } else {
      if (pos === 'unshift') {
        state.commentReplyList.unshift(...items)
      } else {
        state.commentReplyList.push(...items)
      }
    }
  },
  updateArticleCommentTotal (state, newValue) {
    // 如果没传 payload，那么就自增 1
    if (newValue === undefined) {
      state.articleCommentTotal++
    } else {
      state.articleCommentTotal = newValue
    }
  },
  updateContentOfPublishCommentPopup (state, newValue = '') {
    state.contentOfPublishCommentPopup = newValue.trim()
  },
  updateIsShowPublishCommentPopup (state, newValue) {
    state.isShowPublishCommentPopup = newValue
  }
}
addNsname(nsname, mutations)

// for (const mutation of Object.values(mutations)) {
//   mutation.nsname = nsname + mutation.name
// }

export const actions = {
  // target - 评论的目标id（评论文章即为文章id，对评论进行回复则为评论id）
  // artId - 如果不传，说明是对文章进行评论，如果传了，说明是对评论进行回复
  publishComment (ctx, [target, artId]) {
    console.log('%c [ target ]-48', 'font-size:13px; background:pink; color:#bf2c9f;', target)
    console.log('%c [ artId ]-48', 'font-size:13px; background:pink; color:#bf2c9f;', artId)
    console.log('%c [ ctx.state.contentOfPublishCommentPopup ]-54', 'font-size:13px; background:pink; color:#bf2c9f;', ctx.state.contentOfPublishCommentPopup)
    return publishComment({
      target,
      // 这个 ctx 就是当前子模块的 store，所以在访问 state 时，不用再点子模块名称了
      content: ctx.state.contentOfPublishCommentPopup,
      art_id: artId
    }).then(res => {
      // 和 vuex 相关的，可以直接封装到这个 action 里面去，思考一下哪些能丢到 action 中
      // 函数 .name 就是函数的名字，这里由于 ctx 是当前模块，所以能直接调到当前模块的 mutation 中，不需要加完整命名空间
      ctx.commit(mutations.updateContentOfPublishCommentPopup.name, '')
      ctx.commit(mutations.addListItems.name, [[res.data.data.new_obj], artId ? 'c' : 'a', 'unshift'])
      return res
    })
    // return 123
    // 这里不能直接 throw 异常，因为 vuex 内部在调用 action 的时候，没有 try...catch 这种异常
    // throw new Error('asdf')
    // return Promise.reject(new Error('呵呵哒'))
  }
}
addNsname(nsname, actions)

// for (const action of Object.values(actions)) {
//   action.nsname = nsname + action.name
// }

const modules = {}

export default {
  name,
  namespaced: true,
  state,
  mutations,
  actions,
  getters,
  modules
}
